package main

import "fmt"

func main() {
	a := A{X: 1, Y: 2}
	DoSomething1(&a)
	fmt.Println(a) // {100 200}

	a = A{X: 1, Y: 2}
	DoSomething2(a)
	fmt.Println(a) // {1 2} {

}

type A struct {
	X int
	Y int
}

// DoSomething1 传入的a是指向A类型的指针，b := a，b和a指向同一个内存地址，修改b的值，a的值也会改变
func DoSomething1(a *A) {
	b := a
	b.X = 100
	b.Y = 200
}

// DoSomething2 传入的a是A类型的值，b := a，先将a复制一份，然后将复制的a的地址赋值给b，
// b和a是两个不同的内存地址，修改b的值，a的值不会改变
func DoSomething2(a A) {
	b := &a
	b.X = 100
	b.Y = 200
}
